﻿
#include<stdio.h>
#include<assert.h>
#include<iostream>
#include<string.h>
//strstr的作用是在一个字符串中查找一个子字符串
using namespace std;
void test01() {
	const char* s = "abcdefgjjjj";
	const char* p = "fg";
	const char* ret = strstr(s, p);//在C++中，strstr有两种重载，1,const char* strstr(const char* str1,const char* str2); 
	//2,char* strstr(char* s1,const char* s2);可以看出当参数中含有非常量参数时，返回值也是非常量
	//*(ret + 1) = 'v';
	cout << ret << endl;
	//char* ret1 = ret;
}//这里要注意的是"ab"是一个常量字符串，此时的编译环境是C++所以
//应用const char* 来修饰，但在c语言中，可以直接用char* 修饰	


//strstr的模拟实现
const char* my_strstr(const char* str1, const char* str2) {
	assert(str1 && str2);
	const char* s1 = NULL;
	const char* s2 = NULL;
	const char* cur = str1;
	while (*cur) {
		s1 = cur;
		s2 = str2;
		while (*s1 && *s2 && *s1 == *s2) {
			s1++, s2++;
		}
		if (*s2 == '\0') {
			return cur;
		}
		cur++;
	}
	return NULL;
}
void test02() {
	const char* str1 = "abcccdef";
	const char* str2 = "cdefg";
	const char* ret = my_strstr(str1, str2);
	cout << ret << endl;
}


//内存函数 
//memcpy
void test03() {
	int arr[] = { 1,2,3,4,5,6,7};
	int arr2[20] = {0};
	memcpy(arr2, arr + 3, 12);//内存拷贝函数，参数1：拷贝目的地 参数2：拷贝对象 参数3：要拷贝的字节数
	for (auto e : arr2) {
		cout << e << ' ';
	}
}


//memcpy模拟实现
void* my_memcpy(void* des, void* src, size_t num) {
	assert(des && src);
	void* ret = des;
	for (int i = 0; i < num; i++) {
		*((char*)des) = *((char*)src);
		des = (char*)des + 1;
		src = (char*)src + 1;//des和src强转后是临时的不能直接进行++
	}
	return ret;
}
void test04() {
	int arr[] = { 1,2,3,4,5,6,7 };
	int arr2[20] = { 0 };
	my_memcpy(arr2, arr + 3, 12);
	for (auto e : arr2) {
		cout << e << ' ';
	}
}
//memcpy 模拟实现

//memove 支持同一块空间上的内存块移动
void test05() {
	int arr[] = { 1,2,3,4,5,6,7 };
	int arr2[20] = { 0 };
	memmove(arr, arr + 3, 12);
	for (auto e : arr) {
		cout << e << " ";
	}
}
//memmove模拟实现
void* my_memmove(void* des,void* src,size_t num) {
	assert(des && src);
	void* ret = des;
	if (des < src) {
		while (num--) {
			*(char*)des = *(char*)src;
			des = (char*)des + 1;
			src = (char*)src + 1;
		}
	}
	else {
		while (num--) {
			*((char*)des + num) = *((char*)src + num);
		}
	}
	return ret;
}
//memmove 模拟实现


void test06() {
	int arr[] = { 1,2,3,4,5,6,7 };
	int arr2[20] = { 0 };
	my_memmove(arr, arr + 3, 12);
	for (auto e : arr) {
		cout << e << " ";
	}
}
int main() {
	//test01();
	//test02();
	//test03();
	//test04();
	//test05();
	test06();
	return 0;
}